home *** CD-ROM | disk | FTP | other *** search
/ MacHack 2000 / MacHack 2000.toast / pc / The Hacks / MacHacksBug / Python 1.5.2c1 / Tools / freeze / makefreeze.py < prev    next >
Encoding:
Text File  |  2000-06-23  |  2.3 KB  |  86 lines

  1. import marshal
  2. import string
  3. import bkfile
  4.  
  5.  
  6. # Write a file containing frozen code for the modules in the dictionary.
  7.  
  8. header = """
  9. #include "Python.h"
  10.  
  11. static struct _frozen _PyImport_FrozenModules[] = {
  12. """
  13. trailer = """\
  14.     {0, 0, 0} /* sentinel */
  15. };
  16. """
  17.  
  18. # if __debug__ == 0 (i.e. -O option given), set Py_OptimizeFlag in frozen app.
  19. default_entry_point = """
  20. int
  21. main(argc, argv)
  22.     int argc;
  23.     char **argv;
  24. {
  25. """ + ((not __debug__ and """
  26.         Py_OptimizeFlag++;
  27. """) or "")  + """
  28.         PyImport_FrozenModules = _PyImport_FrozenModules;
  29.         return Py_FrozenMain(argc, argv);
  30. }
  31.  
  32. """
  33.  
  34. def makefreeze(base, dict, debug=0, entry_point = None):
  35.     if entry_point is None: entry_point = default_entry_point
  36.     done = []
  37.     files = []
  38.     mods = dict.keys()
  39.     mods.sort()
  40.     for mod in mods:
  41.         m = dict[mod]
  42.         mangled = string.join(string.split(mod, "."), "__")
  43.         if m.__code__:
  44.             file = 'M_' + mangled + '.c'
  45.             outfp = bkfile.open(base + file, 'w')
  46.             files.append(file)
  47.             if debug:
  48.                 print "freezing", mod, "..."
  49.             str = marshal.dumps(m.__code__)
  50.             size = len(str)
  51.             if m.__path__:
  52.                 # Indicate package by negative size
  53.                 size = -size
  54.             done.append((mod, mangled, size))
  55.             writecode(outfp, mangled, str)
  56.             outfp.close()
  57.     if debug:
  58.         print "generating table of frozen modules"
  59.     outfp = bkfile.open(base + 'frozen.c', 'w')
  60.     for mod, mangled, size in done:
  61.         outfp.write('extern unsigned char M_%s[];\n' % mangled)
  62.     outfp.write(header)
  63.     for mod, mangled, size in done:
  64.         outfp.write('\t{"%s", M_%s, %d},\n' % (mod, mangled, size))
  65.     outfp.write(trailer)
  66.     outfp.write(entry_point)
  67.     outfp.close()
  68.     return files
  69.  
  70.  
  71.  
  72. # Write a C initializer for a module containing the frozen python code.
  73. # The array is called M_<mod>.
  74.  
  75. def writecode(outfp, mod, str):
  76.     outfp.write('unsigned char M_%s[] = {' % mod)
  77.     for i in range(0, len(str), 16):
  78.         outfp.write('\n\t')
  79.         for c in str[i:i+16]:
  80.             outfp.write('%d,' % ord(c))
  81.     outfp.write('\n};\n')
  82.  
  83. ## def writecode(outfp, mod, str):
  84. ##     outfp.write('unsigned char M_%s[%d] = "%s";\n' % (mod, len(str),
  85. ##     string.join(map(lambda s: `s`[1:-1], string.split(str, '"')), '\\"')))
  86.